package com.example.springbootsenior.AOP.buy.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 功能描述:
 *
 * @author: 李明杰
 * @date: 2021/11/25 13:57
 */
@Aspect
@Component
public class BuyAspectJ {
    /**
     * <li/>定义切点，不必关心方法名和内容
     */
    @Pointcut("execution(* com.example.springbootsenior.AOP.buy.service.IBuy.buy())")
    public void point() {
    }

    /**
     * <li/>第一个*代表所有返回值类型
     * <li/>(..)代表不关心参数
     * <li/>&&、||、! 可以增加条件（此处只让girl生效）
     */
    @Before("point()&&bean(girl)&&within(com.example.springbootsenior.AOP.buy.service.impl.*)")
    public void haha() {
        System.err.println("男孩女孩都买自己喜欢的东西");
    }

    @Pointcut("execution(String com.example.springbootsenior.AOP.buy.service.IBuy.buy(double))&&args(price)&&bean(girl)")
    public void gif(double price) {
    }

    /**
     * <li/>pj.proceed();可以控制方法是否执行
     * <li/>return 可以控制改变原来函数的返回值
     */
    @Around("gif(price)")
    public String haha2(ProceedingJoinPoint pj, double price) {
        try {
            pj.proceed();
            if (price > 68) {
                System.err.println("女孩买衣服超过了68元，赠送一双袜子");
                return "衣服和袜子";
            }
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return "衣服";
    }

    @Pointcut("@annotation(com.example.springbootsenior.AOP.buy.annotation.AimPoint)")
    public void adult() {
    }

    @Before("adult()")
    public void haha3(JoinPoint joinPoint) {
        System.out.println("joinPoint.getArgs() = " + Arrays.toString(joinPoint.getArgs()));
        System.err.println("我买了自己喜欢的东西");
    }
}
